package com.qf.netty.handler;

import com.qf.netty.entity.Message;
import com.qf.netty.entity.Rooms;
import com.qf.netty.entity.User;
import com.qf.netty.handler.base.BaseMsgChannelHandler;
import com.qf.netty.utils.RoomUtils;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelHandlerContext;
import org.kurento.client.KurentoClient;
import org.kurento.client.MediaPipeline;
import org.kurento.client.WebRtcEndpoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 客户端连接服务器后的注册消息的处理器
 * author Ken
 * create_time 2023/1/4
 */
@Component
@ChannelHandler.Sharable
public class RegisterMsgChannelHandler extends BaseMsgChannelHandler {

    @Autowired
    private KurentoClient kurentoClient;

    @Override
    protected int action() {
        return 1;
    }

    @Override
    protected void handler(ChannelHandlerContext ctx, Message msg) {
        //获取当前的房间号
        Integer roomId = Integer.parseInt(msg.getMsg() + "");
        //获取当前的角色
        String role = msg.getRole();

        if (role.equals("master")) {
            //主播
            //创建房间
            Rooms rooms = new Rooms();
            rooms.setRoomId(roomId);
            //创建媒体轨道 - 和房间绑定在一起
            MediaPipeline mediaPipeline = kurentoClient.createMediaPipeline();
            rooms.setMediaPipeline(mediaPipeline);

            //创建一个主播的WebRtcEndPoint对象
            WebRtcEndpoint webRtcEndpoint = new WebRtcEndpoint.Builder(mediaPipeline).build();

            //创建一个主播的User对象
            User master = new User()
                    .setChannel(ctx.channel())
                    .setWebRtcEndpoint(webRtcEndpoint);
            rooms.setMaster(master);
            //管理起来
            RoomUtils.addRooms(rooms);
        } else {
            //观看者
            Rooms rooms = RoomUtils.getRooms(roomId);
            if (rooms == null) {
                //观看者观看的房间不存在
                Message message = new Message().setAction(-1);
                ctx.writeAndFlush(message);
                return;
            }

            //观看者也需要创建一个WebRTCEndPoint对象
            WebRtcEndpoint lookWebRtcEndPoint = new WebRtcEndpoint.Builder(rooms.getMediaPipeline()).build();

            //【重要的一步，观看者 如何 确定主播的媒体数据】
            rooms.getMaster().getWebRtcEndpoint().connect(lookWebRtcEndPoint);

            User slave = new User()
                    .setChannel(ctx.channel())
                    .setWebRtcEndpoint(lookWebRtcEndPoint);

            //将当前用户的Channel设置为观看者
            rooms.addSlave(slave);

            //通知房间中的所有用户，更新当前的观看者人数
            Message message = new Message()
                    .setAction(2)
                    .setMsg(rooms.getSlaves().size());
            //将当前消息发送给房间中的所有用户
            rooms.sendMessageAll(message, true);

            //告知观看者 房间加入成功
            Message result = new Message()
                    .setAction(6);
            ctx.writeAndFlush(result);
        }
    }
}
